/*
* Conditions Of Use 
* 
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain.  As a result, a formal
* license is not needed to use the software.
* 
* This software is provided by NIST as a service and is expressly
* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY.  NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
* 
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*  
* .
* 
*/
package gov.nist.javax.sip.header;
import gov.nist.core.*;
import gov.nist.javax.sip.header.ims.*;

import java.util.Hashtable;

/**
 * A mapping class that returns the SIPHeader for a given header name.
 * Add new classes to this map if you are implementing new header types if
 * you want some of the introspection based methods to work.
 * @version 1.2 $Revision: 1.10 $ $Date: 2009/01/22 19:33:48 $
 * @since 1.1
 */
public class NameMap implements SIPHeaderNames, PackageNames {
	static Hashtable nameMap;
	static {
		initializeNameMap();
	}

	protected static void putNameMap(String headerName, String className) {
		nameMap.put(
			headerName.toLowerCase(),
			className);
	}

	public static Class getClassFromName(String headerName) {
		String className = (String) nameMap.get(headerName.toLowerCase());
		if (className == null)
			return null;
		else {
			try {
				return Class.forName(className);
			} catch (ClassNotFoundException ex) {
				return null;
			}
		}
	}

	/** add an extension header to this map.
	*@param headerName is the extension header name.
	*@param className is the fully qualified class name that implements
	* the header (does not have to belong to the nist-sip package).
	* Use this if you want to use the introspection-based methods.
	*/

	public static void addExtensionHeader(
		String headerName,
		String className) {
		nameMap.put(headerName.toLowerCase(), className);
	}

	private static void initializeNameMap() {
		nameMap = new Hashtable();
		putNameMap(MinExpires.NAME, MinExpires.class.getName()); // 1

		putNameMap(ErrorInfo.NAME, ErrorInfo.class.getName()); // 2

		putNameMap(MimeVersion.NAME, MimeVersion.class.getName()); // 3

		putNameMap(InReplyTo.NAME, InReplyTo.class.getName()); // 4

		putNameMap(Allow.NAME, Allow.class.getName()); // 5

		putNameMap(ContentLanguage.NAME, ContentLanguage.class.getName()); // 6

		putNameMap(CALL_INFO, CallInfo.class.getName()); //7

		putNameMap(CSEQ, CSeq.class.getName()); //8

		putNameMap(ALERT_INFO, AlertInfo.class.getName()); //9

		putNameMap(ACCEPT_ENCODING, AcceptEncoding.class.getName()); //10

		putNameMap(ACCEPT, Accept.class.getName()); //11

		putNameMap(ACCEPT_LANGUAGE, AcceptLanguage.class.getName()); //12

		putNameMap(RECORD_ROUTE, RecordRoute.class.getName()); //13

		putNameMap(TIMESTAMP, TimeStamp.class.getName()); //14

		putNameMap(TO, To.class.getName()); //15

		putNameMap(VIA, Via.class.getName()); //16

		putNameMap(FROM, From.class.getName()); //17

		putNameMap(CALL_ID, CallID.class.getName()); //18

		putNameMap(AUTHORIZATION, Authorization.class.getName()); //19

		putNameMap(PROXY_AUTHENTICATE, ProxyAuthenticate.class.getName()); //20

		putNameMap(SERVER, Server.class.getName()); //21

		putNameMap(UNSUPPORTED, Unsupported.class.getName()); //22

		putNameMap(RETRY_AFTER, RetryAfter.class.getName()); //23

		putNameMap(CONTENT_TYPE, ContentType.class.getName()); //24

		putNameMap(CONTENT_ENCODING, ContentEncoding.class.getName()); //25

		putNameMap(CONTENT_LENGTH, ContentLength.class.getName()); //26

		putNameMap(ROUTE, Route.class.getName()); //27

		putNameMap(CONTACT, Contact.class.getName()); //28

		putNameMap(WWW_AUTHENTICATE, WWWAuthenticate.class.getName()); //29

		putNameMap(MAX_FORWARDS, MaxForwards.class.getName()); //30

		putNameMap(ORGANIZATION, Organization.class.getName()); //31

		putNameMap(PROXY_AUTHORIZATION, ProxyAuthorization.class.getName()); //32

		putNameMap(PROXY_REQUIRE, ProxyRequire.class.getName()); //33

		putNameMap(REQUIRE, Require.class.getName()); //34

		putNameMap(CONTENT_DISPOSITION, ContentDisposition.class.getName()); //35

		putNameMap(SUBJECT, Subject.class.getName()); //36

		putNameMap(USER_AGENT, UserAgent.class.getName()); //37

		putNameMap(WARNING, Warning.class.getName()); //38

		putNameMap(PRIORITY, Priority.class.getName()); //39

		putNameMap(DATE, SIPDateHeader.class.getName()); //40

		putNameMap(EXPIRES, Expires.class.getName()); //41

		putNameMap(SUPPORTED, Supported.class.getName()); //42

		putNameMap(REPLY_TO, ReplyTo.class.getName()); // 43

		putNameMap(SUBSCRIPTION_STATE, SubscriptionState.class.getName()); //44

		putNameMap(EVENT, Event.class.getName()); //45

		putNameMap(ALLOW_EVENTS, AllowEvents.class.getName()); //46

		
		// pmusgrave - extensions
		putNameMap(REFERRED_BY, "ReferredBy");
		putNameMap(SESSION_EXPIRES, "SessionExpires");
		putNameMap(MIN_SE, "MinSE");
		putNameMap(REPLACES, "Replaces");
		// jean deruelle
		putNameMap(JOIN, "Join");

		
		// IMS Specific headers.
		
		putNameMap(PAccessNetworkInfoHeader.NAME, PAccessNetworkInfo.class.getName());
		
		putNameMap(PAssertedIdentityHeader.NAME, PAssertedIdentity.class.getName());
		
		putNameMap(PAssociatedURIHeader.NAME, PAssociatedURI.class.getName());
		
		putNameMap(PCalledPartyIDHeader.NAME, PCalledPartyID.class.getName());
		
		putNameMap(PChargingFunctionAddressesHeader.NAME,  PChargingFunctionAddresses.class.getName())	;
		
		putNameMap(PChargingVectorHeader.NAME,PChargingVector.class.getName());
		
		putNameMap(PMediaAuthorizationHeader.NAME,PMediaAuthorization.class.getName());
		
		putNameMap(Path.NAME, Path.class.getName());
		
		putNameMap(PPreferredIdentity.NAME, PPreferredIdentity.class.getName());
		
		putNameMap(Privacy.NAME,Privacy.class.getName());
		
		putNameMap(ServiceRoute.NAME, ServiceRoute.class.getName());
		
		putNameMap(PVisitedNetworkID.NAME, PVisitedNetworkID.class.getName());
		
		

	}
}
